﻿using System;
using System.Collections.Generic;
using System.Text;

namespace HZY.DbExtensions
{
    using HzySql;
    using HzySql.Core.SqlServer;
    using HzySql.Models;
    using Microsoft.Extensions.DependencyInjection;
    using System.Linq;

    public static class HzySqlContextExtensions
    {
        /// <summary>
        /// 模型注册
        /// </summary>
        private static void ModelRegister()
        {
            #region 框架模型
            ModelSet.GetOrCacheFieldInfo<HZY.Models.Sys.Sys_AppLog>(XmlParser);
            ModelSet.GetOrCacheFieldInfo<HZY.Models.Sys.Sys_Function>(XmlParser);
            ModelSet.GetOrCacheFieldInfo<HZY.Models.Sys.Sys_Menu>(XmlParser);
            ModelSet.GetOrCacheFieldInfo<HZY.Models.Sys.Sys_MenuFunction>(XmlParser);
            ModelSet.GetOrCacheFieldInfo<HZY.Models.Sys.Sys_Role>(XmlParser);
            ModelSet.GetOrCacheFieldInfo<HZY.Models.Sys.Sys_RoleMenuFunction>(XmlParser);
            ModelSet.GetOrCacheFieldInfo<HZY.Models.Sys.Sys_User>(XmlParser);
            ModelSet.GetOrCacheFieldInfo<HZY.Models.Sys.Sys_UserRole>(XmlParser);
            #endregion

            //base
            ModelSet.GetOrCacheFieldInfo<HZY.Models.Member>(XmlParser);

            
        }

        private static Action<System.Reflection.PropertyInfo, FieldInfo, Type> XmlParser = (propertyinfo, fieldInfo, type) =>
        {
            fieldInfo.Remarks = HZY.Toolkit.ReadXmlSummary.XMLForMember(propertyinfo)?.InnerText?.Trim()?.Split('=', '>')?[0];
        };

        /// <summary>
        /// 使用 HzySql 及模型注册
        /// 本注册 采用 row number 模式分页 适用于 mssql 08 数据库
        /// </summary>
        /// <param name="services"></param>
        /// <param name="connectString"></param>
        /// <returns></returns>
        public static IServiceCollection UseHzySqlContextRowNumber(this IServiceCollection services, string connectString)
        {
            ModelRegister();
            return services.AddScoped(w => new HzySqlDbContext(connectString, PagingMode.ROW_NUMBER));
        }


        /// <summary>
        /// 使用 HzySql 及模型注册
        /// </summary>
        /// <param name="services"></param>
        /// <param name="connectString"></param>
        /// <returns></returns>
        public static IServiceCollection UseHzySqlContext(this IServiceCollection services, string connectString)
        {
            ModelRegister();

            #region HzySqlContext 注入

            var hzySqlDbContext = new HzySqlDbContext(connectString);
            //在同一个Scope内只初始化一个实例 ，可以理解为（ 每一个request级别只创建一个实例，同一个http request会在一个 scope内）
            services.AddScoped(w => hzySqlDbContext);
            //每一次GetService都会创建一个新的实例
            //return services.AddTransient<HzySqlContext>(w => hzySqlDbContext);

            //单利模式，整个应用程序生命周期以内只创建一个实例
            //return services.AddSingleton<HzySqlContext>(w => hzySqlDbContext);

            #endregion

            return services;
        }






    }
}
